#ifndef LANEFUNCTION_H
#define LANEFUNCTION_H
#include <QString>
#include <QByteArray>
#include <QTextCodec>
#include <QDateTime>
#include <cstdio>


using namespace std;
/*!
 \brief
 gb2312编码转utf8编码
 \param string
 gb2312编码字符串
 \param size
 字符串长度，当确定字符串是以‘\0’结尾时，可不填写
 \return QString
 utf8编码字符串
*/
inline QString gb2312toUtf8(const char *string, int size = -1)
{
    if(size == -1)
    {
        return QTextCodec::codecForName("GB18030")->toUnicode(string);
    }
    else
    {
        return QTextCodec::codecForName("GB18030")->toUnicode(string, size);
    }
}

inline QByteArray utf8toGb2312(const char *str, int size = -1)
{
    return QTextCodec::codecForName("GB18030")->fromUnicode(QTextCodec::codecForName("UTF-8")->toUnicode(str, size));
}

inline QByteArray utf8toGb2312(const QString &str)
{
    return QTextCodec::codecForName("GB18030")->fromUnicode(str);
}

/*!
 \brief
    返回wValue的低4位
 \param wValue
 \return quint8
*/
inline quint8 lowByte(quint16 wValue)
{
    return (quint8)(wValue & 0xFF);
}

/*!
 \brief
    返回wValue的高4位
 \param wValue
 \return quint8
*/
inline quint8 highByte(quint16 wValue)
{
    return (quint8)((wValue >> 8) & 0xFF );
}

/*!
 * \brief 测试一个字节b的第i位是否为1。
 * \param b 被测试字节。
 * \param i 第0-7位，7为最高位。
 */
inline bool testBit(quint8 b, quint8 i)
{
    if (i>7) return false;
    return b & (0x01<<i);
}

/*!
 \brief
    生成校验码
 \param buffer
    输入字符串
 \param length
    字符串长度
 \param verifyCode
    校验码[out]
*/
void getCheckCode(const char *buffer, const int length, char *verifyCode);

/*!
 \brief
    将QDateTime时间转换为BCD码的时间字符串，len应在2-7之间，
    即可以只转换年（2字节），或转换年月日时分秒（7字节）
 \param bcd
    bcd码时间字符串指针[out]
 \param len
    bcd码数据长度
 \param sysTime
    QDateTime时间
 \return bool
    转换成功
*/
bool systime2bcd(char *bcd, int len, const QDateTime &sysTime);

/*!
 \brief
    将十进制字符串转换成原始数据
    例如字符串'123456'6个字节转换成字符串quint8(12)，quint8(34)，quint8(56)3个字节
 \param pData
    转换后的字符串[out]
 \param szMsg
    输入的字符串
 \param msgLen
    输入字符串长度
 \return bool
    是否转换成功
*/
bool hex2Raw(quint8 *pData, const char *szMsg, int msgLen);

/*!
 \brief
    将QDateTime时间转换成14位字符串
 \param dateTime
    QDateTime时间
 \param timeChar14
    14位字符串[out]
*/
void dateTimeToChar14(const QDateTime &dateTime, char *timeChar14);

/*!
 \brief
    将unsigned long类型转换成一定长度的字符串
 \param strBuff
    转换后的字符串[out]
 \param bufferLen
    字符串长度
 \param ulong
    要转换的无符号长整数
 \return int
    0		成功
    -1		参数错误
    >0		转换成功，但余数未转换完，有溢出
*/
int ulong2StrBuf(char* strBuff, size_t bufferLen, unsigned long ulong);
/*!
 * \brief bcd2dword
 * \param bcd
 * \param len
 * \return
 */
quint32 bcd2dword(const char *bcd, int len);

/*!
 * \brief bcd转日期
 * \param pDate 输出日期
 * \param bcd 输入，长度4字节，BCD编码
 * \return 日期格式是否正确
 */
bool bcd2date(QDate *pDate, const quint8 *bcd);

/*!
 * \brief bcd2systime
 * \param pTime
 * \param bcd
 * \param bcdLen
 * \return
 */
bool bcd2systime(QDateTime *pTime, const char *bcd, int bcdLen = 4);
/*!
 * \brief bcd2byte
 * \param bcd
 * \return
 */
quint8 bcd2byte( quint8 bcd );

/*!
 \brief
    将原始数据转换成十进制字符串
 \param hexStr
    十进制字符串
 \param rawData
    原始数据
 \param rawLen
    原始数据长度
*/
void raw2HexStr(char *hexStr, const quint8 *rawData, int rawLen);

/*!
 \brief
    将char 数组转换成整型
 \param szBuff char型数组
 \param nBuffLen 数组长度
 \return int   整型数据
*/
int charToInt(const char *buff, int len);


#endif // LANEFUNCTION_H
